import algebra
import encontraTetas
import math


class Localizador:

	def __init__(self,lado,arq1='./audio/rec1.wav',arq2='./audio/rec2.wav',arq3='./audio/rec3.wav'):
		self.arq1 = arq1
		self.arq2 = arq2
		self.arq3 = arq3
		self.retas = []
		self.cruzamentos = []
		self.l = lado
		self.localizacao = None
		self.inicializacoes(lado)
		
	def inicializacoes(self,l):
		self.initPontosBase(l)
		self.initPontosMedios(l)
		self.initTetas(l)
		#self.initRetasPer(l)

	def initPontosBase(self,l):
		self.pontosBase = [
								algebra.Ponto(l,0),
								algebra.Ponto(0.5*l,math.sqrt(3)/2*l),
								algebra.Ponto(0,0)
								]
							
	def initPontosMedios(self,l):
		self.pontosMedios = [
									algebra.Ponto(3/4*l,math.sqrt(3)/4*l),
									algebra.Ponto(0.25*l,math.sqrt(3)/4*l),
									algebra.Ponto(0.5*l,0)
									]
	def initRetasPer(self,l):
		self.retasPer = [
								algebra.Retas(math.sqrt(3)/3,0),
								algebra.Retas(-math.sqrt(3)/3,math.sqrt(3)/3*l),
								algebra.Retas(0,1/2*l)
							 ]
							 
	def initTetas(self,l):
		findTetas = encontraTetas.EncontraTeta(3,l,self.arq1,self.arq2,self.arq3)
		findTetas.analisar()
		findTetas.encontraTetas()
		self.tetas = findTetas.getTetas()
		aux = self.tetas[1]
		self.tetas[1] = self.tetas[2]
		self.tetas[2] = aux
								
	def calculaRetas(self,l):
		#retas q cortam a face 1
		m1 = math.tan( self.tetas[0] + math.atan(math.sqrt(3)/3) )
		m2 = math.tan( (math.pi - self.tetas[0]) + math.atan(math.sqrt(3)/3) )
		self.retas.append(self.retaFace1(m1,l))
		self.retas.append(self.retaFace1(m2,l))
		
		#retas q cortam a face 2
		m1 = math.tan( self.tetas[1] + math.atan(-math.sqrt(3)/3) )
		m2 = math.tan( (math.pi - self.tetas[1]) + math.atan(-math.sqrt(3)/3) )
		self.retas.append(self.retaFace2(m1,l))
		self.retas.append(self.retaFace2(m2,l))
		
		#retas q cortam a face 3
		m1 = math.tan( math.pi/2 - self.tetas[2] )
		m2 = math.tan( math.pi/2 + self.tetas[2] )
		self.retas.append(self.retaFace3(m1,l))
		self.retas.append(self.retaFace3(m2,l))
		
	def retaFace1(self,m,l):
		b = (-0.25*l)*(3*m - math.sqrt(3))
		return algebra.Reta(m,b)
		
	def retaFace2(self,m,l):
		b = (0.25*l)*(math.sqrt(3) - m)
		return algebra.Reta(m,b)
		
	def retaFace3(self,m,l):
		b = -0.5*l*m
		return algebra.Reta(m,b)
		
	def calculaCruz(self):
		#combinacao das retas
		for i in range(0,6): #qde de retas
				for j in range(i+1,6): #qde de retas
					self.cruzamentos.append( self.retas[i].pontoCruzCom(self.retas[j]) )
	
	def encontraFonte(self):
		l = self.l
		maiorNorma = 0
		for ponto in self.cruzamentos:
			norma = ponto.norma()
			if norma > maiorNorma:
				maiorNorma = norma		
		centro = algebra.Ponto(0.5*l,math.sqrt(3)/6*l)
		raio = math.sqrt( centro.x**2 + centro.y**2 )
		circulo = algebra.Circunferencia(centro,maiorNorma/2)
		self.provaveis = []
		for ponto in self.cruzamentos:
			if circulo.relacao(ponto) == 'exterior':
				self.provaveis.append(ponto)
		self.provavel = self.definePonto(self.provaveis)
	
	def definePonto(self,provaveis):
		mx = 0
		my = 0
		for ponto in provaveis:
			mx = mx + ponto.x
			my = my + ponto.y
		n = len(provaveis)
		mx = mx / n
		my = my / n
		return algebra.Ponto(mx,my)
	
##----------------------##
##------- TESTER -------##

if __name__ == '__main__':
	loc = Localizador(30)
	loc.calculaRetas(30)
	loc.calculaCruz()
	loc.encontraFonte()
	for prov in loc.provaveis:
		print 'provavel = (%s,%s)' % (prov.x,prov.y)
	print 'Ponto provavel = (%s,%s)' % (loc.provavel.x,loc.provavel.y)
	import desenhoTriangulo
	angulos = []
	for teta in loc.tetas:
		angulos.append(math.degrees(teta)) 
	print angulos
	#desenho = desenhoTriangulo.DesenhoTriangulo(30,angulos[0],angulos[1],angulos[2])
	#desenho.desenhar()
